<template>
  <router-view/>
</template>

<script>


import {getCurrentInstance,inject,nextTick,reactive, toRefs,toRef,onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted, ref,defineComponent,toRaw,watch} from 'vue'

import { useMainStore } from './store'  //pinia 使用 类似 vuex
import { storeToRefs } from 'pinia'//pinia 使用 类似 vuex


import SoftKey3W from "../src/util/Syunew3W.js"
import {useRouter} from "vue-router";
//reactive
export default defineComponent({
  name: 'App',//组件名称
  components: {},//组件引用
  setup (props,context) {


    const apiUrl = inject('$apiUrl'); // 变量全局化 后台地址
    const $axios = inject('$axiosInterceptor');// 变量全局化 axios
    const $ViewUIPlus = inject('$ViewUIPlus');//引用全局组件
    const router = useRouter();//路由跳转使用



    const state = reactive({
      bConnect:0,
      keyID:''

    });




    const connectLoad = ()=> {

      try {
        var s_pnp = new SoftKey3W();
        s_pnp.Socket_UK.onopen = function() {
          state.bConnect = 1; //代表已经连接，用于判断是否安装了客户端服务
          setTimeout(() => login_onclick(), 500);
        };
        s_pnp.Socket_UK.onmessage = function got_packet(Msg) {
          var PnpData = JSON.parse(Msg.data);
          if (PnpData.type == "PnpEvent") {
            //如果是插拨事件处理消息
            if (PnpData.IsIn) {
              login_onclick()
              // alert("UKEY已被插入，被插入的锁的路径是："+PnpData.DevicePath);
            } else {
              var data = sessionStorage.getItem("loginData") ? JSON.parse(sessionStorage.getItem("loginData")) :'';
              if (data.access_token != '') {
                if (data.userInfo.safetyUkey == state.keyID.toUpperCase()){
                  $ViewUIPlus.Message.warning({
                    content: "身份识别证书已拔出，即将退出登录...",
                    duration: 3,
                    onClose: function() {

                      var data = sessionStorage.getItem("loginData") ? JSON.parse(sessionStorage.getItem("loginData")) :'';
                      let formData = new FormData();
                      for (let key in data) {
                        formData.append(key, data[key]);
                      }
                      $axios.post(apiUrl.ssoLogout,formData, {headers: {"Content-Type": "application/x-www-form-urlencoded"}}).then((res) => {
                        if(!!res){
                          state.formData = res.data.data;
                        }
                      }).catch((err) => {
                        console.log("失败", err)
                      })
                      sessionStorage.clear(); // 删除所有数据
                      router.push({ path: '/', query: {}})
                    }
                  });
                }
              }
              // alert("UKEY已被拨出，被拨出的锁的路径是："+PnpData.DevicePath);
            }
          }
        };
      } catch (e) {
        console.log(e)
        return false;
      }
    }
    const login_onclick = ()=> {

      //TODO
      return false;
      //判断是否安装了服务程序，如果没有安装提示用户安装
      if(state.bConnect==0) {
        console.log("未能连接服务程序，请确定服务程序是否安装。");
        return false;
      }
      var DevicePath,ret,n,mylen,ID_1,ID_2;
      try {

        //由于是使用事件消息的方式与服务程序进行通讯，
        //好处是不用安装插件，不分系统及版本，控件也不会被拦截，同时安装服务程序后，可以立即使用，不用重启浏览器
        //不好的地方，就是但写代码会复杂一些
        var s_simnew1=new SoftKey3W(); //创建UK类

        s_simnew1.Socket_UK.onopen = function() {
          s_simnew1.ResetOrder();//这里调用ResetOrder将计数清零，这样，消息处理处就会收到0序号的消息，通过计数及序号的方式，从而生产流程
        }

        //写代码时一定要注意，每调用我们的一个UKEY函数，就会生产一个计数，即增加一个序号，较好的逻辑是一个序号的消息处理中，只调用我们一个UKEY的函数
        s_simnew1.Socket_UK.onmessage =function got_packet(Msg) {
          var UK_Data = JSON.parse(Msg.data);
          // alert(Msg.data);
          if(UK_Data.type!="Process")return ;//如果不是流程处理消息，则跳过
          switch(UK_Data.order)
          {
            case 0:
            {
              s_simnew1.FindPort(0);//发送命令取UK的路径
            }
              break;//!!!!!重要提示，如果在调试中，发现代码不对，一定要注意，是不是少了break,这个少了是很常见的错误
            case 1:
            {
              if( UK_Data.LastError!=0){
                state.typeShow = 1
                state.keyID = null
                // EventBus.$emit('alertKey', 2);
                s_simnew1.Socket_UK.close();
                return false;
              }
              state.typeShow = 2
              // EventBus.$emit('alertKey', 1);
              DevicePath=UK_Data.return_value;//获得返回的UK的路径
              s_simnew1.GetID_1(DevicePath); //发送命令取ID_1
            }
              break;
            case 2:
            {
              if( UK_Data.LastError!=0){ console.log("返回ID号错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
              ID_1=UK_Data.return_value;//获得返回的UK的ID_1
              s_simnew1.GetID_2(DevicePath); //发送命令取ID_2
            }
              break;
            case 3:
            {
              if( UK_Data.LastError!=0){ console.log("取得ID错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
              ID_2=UK_Data.return_value;//获得返回的UK的ID_2

              state.keyID = toHex(ID_1)+toHex(ID_2);

              //所有工作处理完成后，关掉Socket
              s_simnew1.Socket_UK.close();
            }
              break;
          }
        }
        s_simnew1.Socket_UK.onclose = function(){}
        return true;
      }
      catch (e) {
        $ViewUIPlus.Message.error(e.name + ": " + e.message);
      }
    }
    const toHex = ( n )=> {
      var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');

      var result = ''
      var start = true;

      for ( var i=32; i>0; ) {
        i -= 4;
        var digit = ( n >> i ) & 0xf;

        if (start && digit === 0){
          result += digitArray[digit];
        }

        if (!start || digit != 0) {
          start = false;
          result += digitArray[digit];
        }
      }

      return ( result == '' ? '0' : result );
    }


    // 其他的生命周期
    onBeforeMount (() => {//beforeMount挂载前状态 // console.log("App ===> 相当于 vue2.x 中 beforeMount")

    })
    onMounted (() => {//mounted 挂载结束状态  // console.log("App ===> 相当于 vue2.x 中 mounted")
      connectLoad()

    })

    // 注意，onBeforeUpdate 和 onUpdated 里面不要修改值
    onBeforeUpdate (() => {//beforeUpdate 更新前状态 // console.log("App ===> 相当于 vue2.x 中 beforeUpdate")

    })

    onUpdated (() => {//updated 更新完成状态 // console.log("App ===> 相当于 vue2.x 中 updated")

    })

    onBeforeUnmount (() => {//beforeDestroy 销毁前状态  // console.log("App ===> 相当于 vue2.x 中 beforeDestroy")
    })

    onUnmounted (() => {//destroyed 销毁完成状态  // console.log("App ===> 相当于 vue2.x 中 destroyed")
    })

    return {
      ...toRefs(state),
    }
  }
})


</script>


<style lang="less">
* {
  font-family: Helvetica, Arial, "Hiragino Sans GB", "Microsoft Yahei", "é»‘ä½“", sans-serif;
}

.size {
  width: 100%;
  height: 100%;
}

html, body {
  .size;
  overflow: hidden;
  margin: 0;
  padding: 0;
}

#app {
  .size;
}

#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  color: #2c3e50;
}


::-webkit-scrollbar-corner,
::-webkit-scrollbar-track {
  background-color: #e2e2e2;
}

::-webkit-scrollbar-thumb {
  border-radius: 0;
  background-color: rgba(0, 0, 0, .3);
}

::-webkit-scrollbar {
  width: 10px;
  height: 10px;
}

::-webkit-scrollbar-thumb:hover {
  background: rgba(0, 0, 0, 0.7)
}
._wz_main{
  width: 100%;
  height: 100%;
  padding: 10px;
}


.demo-drawer-footer {
  width: 100%;
  position: absolute;
  bottom: 0;
  left: 0;
  border-top: 1px solid #e8e8e8;
  padding: 10px 16px;
  text-align: right;
  background: #fff;
}

body{
  ol, ul, dl{
    margin-bottom: 0;
  }

}
//设置 iview 列表字体大小
.ivu-table {
  font-size: 12px!important;
}

.ivu-select-dropdown-list{
  margin-bottom: 0;
}
</style>
